package com.sxj.corejava.code13_JDBC;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class Test01_快速入门 {

    public static void main(String[] args) {
        User user = new User( "jack", "333333", "13812345676", "江苏-苏州");
        insertUser(user);
//        List<User> users = selectAll();
//        for (User user : users) {
//            System.out.println(user);
//        }

//        updateUser(user);
//        deleteById(2);
//        User user = selectById(1);
//        System.out.println(user);
    }

    public static List<User> selectAll() {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        List<User> users = new ArrayList<>();

        try {
            // 1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");
            // 3.获取状态集
            st = conn.createStatement();

            // 4.执行sql
            String sql = "select id,username,password,phone,address from t_user";
            rs = st.executeQuery(sql);

            // 5.结果集映射
            // 结果集:表示数据库结果集的数据表，通常通过执行查询数据库的语句生成
            // 由于在数据库查询的数据可能不止一行,因此对于结果集需要遍历
            // 在结果集中,提供了next()方法,表示读取下一行数据,其返回值为boolean类型
            while (rs.next()) {
                // 只要存在数据,则可以将这一行数据映射成Java中的一个对象
                User user = new User();
                // 可以通过getXxx(param)获取到对应列的字段
                // 其中Xxx表示对应字段的类型,方法参数有两种表示方式
                // 1.可以传递一个int类型的参数,表示列的索引号,其值从1开始,表示第一列
                user.setId(rs.getInt(1));
                // 2.可以传递一个String类型的参数,表示列名
                user.setUsername(rs.getString("username"));
                // 开发中建议使用列名
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                // 由于存在多行数据,因此,最终映射的应该是一个Java对象集合
                // 需要将当前映射的Java对象加入到集合中
                users.add(user);
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放连接出错!");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放状态集出错!");
                }
            }
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放结果集出错!");
                }
            }
        }
        return users;
    }

    public static void insertUser(User user) {
        // 在使用JDBC访问数据库的时候,共分6步
        Connection conn = null;
        Statement st = null;
        try {
            // 1.注册驱动
            // 驱动是由数据库厂商所提供的,根据数据库的类型不同、版本不通,其驱动所在的包与类名也可能不同
            // 此处以MySQL8为例进行操作
            // 通过反射Class.forName("包名.类名")进行驱动的注册
            Class.forName("com.mysql.cj.jdbc.Driver");

            // 2.获取连接
            // 想要访问数据库,必须先连接到数据库
            // 想要连接数据库,需要三个参数
            // 参数一:数据库的url地址,不同数据库url地址也不同
                // 在MySQL8中,其url地址格式为 jdbc:mysql://mysql服务的ip地址:端口号/库名
                // 如果MySQL属于本地的,可以直接使用本地ip127.0.0.1或者localhost
                // 如果MySQL不是本地的,而是服务器上的,则使用服务器ip,例如:192.168.206.1
                // MySQL端口号默认为:3306
                // 在某些情况下,插入中文数据可能会出现乱码
                // 这时候可以在url地址的末尾添加?useUnicode=true&characterEncoding=utf-8
            // 参数二:数据库用户名
            // 参数三:数据库密码
//            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc", "root", "root");
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");

            // 3.获取状态集,用于操作数据库
            st = conn.createStatement();

            // 4.执行sql
            // 准备一个sql语句,用于执行
            String sql = "insert into t_user(username,password,phone,address) values('" + user.getUsername() + "','" + user.getPassword() + "','" + user.getPhone() + "','" + user.getAddress() + "')";
            // 执行DML操作。即:增删改操作
            int row = st.executeUpdate(sql);
            System.out.println("Query OK, " + row + " row affected");

            // 5.对于查询操作,需要将查询到的MySQL数据转换成Java中的数据
            // 对于DML操作,这一步可以省略
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放连接出错!");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放状态集出错!");
                }
            }
        }
    }

    public static void updateUser(User user) {
        Connection conn = null;
        Statement st = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");
            st = conn.createStatement();
            String sql = "update t_user set username = '" + user.getUsername() + "',password = '" + user.getPassword() + "',phone = '" + user.getPhone() + "',address = '" + user.getAddress() + "' where id = " + user.getId() + "";
            int row = st.executeUpdate(sql);
            System.out.println("Query OK, " + row + " row affected");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放连接出错!");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放状态集出错!");
                }
            }
        }
    }

    public static void deleteById(Integer id) {
        Connection conn = null;
        Statement st = null;
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");
            st = conn.createStatement();
            String sql = "delete from t_user where id = " + id + "";
            int row = st.executeUpdate(sql);
            System.out.println("Query OK, " + row + " row affected");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放连接出错!");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放状态集出错!");
                }
            }
        }
    }

    public static User selectById(Integer id) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        User user = null;

        try {
            // 1.注册驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "root");
            // 3.获取状态集
            st = conn.createStatement();

            // 4.执行sql
            String sql = "select id,username,password,phone,address from t_user";
            rs = st.executeQuery(sql);

            // 5.结果集映射
            while (rs.next()) {
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放连接出错!");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放状态集出错!");
                }
            }
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("错误:释放结果集出错!");
                }
            }
        }
        return user;
    }

}
